#include "EditorTextFilePageModel.h"

#include "Object/NewObject.h"
#include "Path/Path.h"
#include "File/FileUtils.h"
#include "Window/EditorWindowGroupModel.h"
#include "Document/TextDocument.h"
#include "Output/Console.h"

TSharedObjectPtr<REditorPageModel> REditorTextFilePageModel::ShareClone(RObject *InOwner) const
{
    TSharedObjectPtr<REditorTextFilePageModel> NewModel = 
        NewObject<REditorTextFilePageModel>(InOwner);
    NewModel->Document = Document;
    NewModel->ContentAreaYOffset = ContentAreaYOffset;
    return NewModel;
}

SPath REditorTextFilePageModel::GetFilePath() const
{
    return Document->GetFilePath();
}

bool REditorTextFilePageModel::HasUnsavedData() const
{
    return Document->HasUnsavedData();
}

void REditorTextFilePageModel::LowLevelSave()
{
    Document->Save();
}

bool REditorTextFilePageModel::Undo()
{
    if(CanUndo())
    {
        Document->Undo(CursorPosition);
        return true;
    }
    return false;
}

bool REditorTextFilePageModel::Redo()
{
    if(CanRedo())
    {
        Document->Redo(CursorPosition);
        return true;
    }
    return false;
}

bool REditorTextFilePageModel::CanUndo() const
{
    return Document->CanUndo();
}

bool REditorTextFilePageModel::CanRedo() const
{
    return Document->CanRedo();
}

TSharedObjectPtr<REditorTextFilePageModel> REditorTextFilePageModel::Create(const SPath &InPath)
{
    TSharedObjectPtr<REditorTextFilePageModel> NewModel = 
        NewObject<REditorTextFilePageModel>(REditorWindowGroupModel::Get());
    NewModel->Document = RTextDocument::Create(InPath);
    return NewModel;
}

// void REditorTextFilePageModel::InitPieceTable()
// {
//     CString FileContent = SFileUtils::ReadToString(FilePath);
//     if(FileContent.IsEmpty())
//     {
//         PieceTable.Buffers.Resize(1);
//         PieceTable.Buffers[0].Text.Clear();
//         return ;
//     }

//     PieceTable.Buffers.Resize(1);
//     PieceTable.Buffers[0].Text = FileContent;
//     //fill line starts
//     PieceTable.Buffers[0].LineStarts.Add(0);
//     int64_t LineFeedCount = 0;
//     for (int64_t i = 0; i < PieceTable.Buffers[0].Text.GetLength(); i++)
//     {
//         if (PieceTable.Buffers[0].Text[i] == '\n')
//         {
//             LineFeedCount++;
//             if((i+1)<PieceTable.Buffers[0].Text.GetLength())
//             {
//                 PieceTable.Buffers[0].LineStarts.Add(i + 1);
//             }
//         }
//     }


//     PieceTable.Nodes.Resize(1);
//     PieceTable.Nodes[0].BufferIndex = 0;
//     PieceTable.Nodes[0].Start.LineIndex = 0;
//     PieceTable.Nodes[0].Start.ColumnIndex = 0;
//     PieceTable.Nodes[0].End.LineIndex = PieceTable.Buffers[0].LineStarts.Num() - 1;
//     PieceTable.Nodes[0].End.ColumnIndex = 
//         PieceTable.Buffers[0].Text.GetLength()-1
//         -PieceTable.Buffers[0].LineStarts.Last();
//         ;
//     PieceTable.Nodes[0].Length = PieceTable.Buffers[0].Text.GetLength();
//     PieceTable.Nodes[0].LineFeedCount = LineFeedCount;

//     PieceTable.CursorPosition.LineIndex = 0;
//     PieceTable.CursorPosition.ColumnIndex = 0;


//     //add test data
//     // PieceTable.Buffers.Clear();
//     // PieceTable.Buffers.Resize(3);
//     // PieceTable.Buffers[0].Text = U"1234567890\n1234567890\n1234567890\n";
//     // PieceTable.Buffers[0].LineStarts.Add(0);
//     // PieceTable.Buffers[0].LineStarts.Add(11);
//     // PieceTable.Buffers[0].LineStarts.Add(22);

//     // PieceTable.Buffers[1].Text = U"AB\n";
//     // PieceTable.Buffers[1].LineStarts.Add(0);

//     // PieceTable.Buffers[2].Text = U"CC";
//     // PieceTable.Buffers[2].LineStarts.Add(0);

//     // PieceTable.Nodes.Clear();
//     // PieceTable.Nodes.Resize(5);
//     // //split first buffer to 2 buffers
//     // PieceTable.Nodes[0].BufferIndex = 0;
//     // PieceTable.Nodes[0].Start.LineIndex = 0;
//     // PieceTable.Nodes[0].Start.ColumnIndex = 0;
//     // PieceTable.Nodes[0].End.LineIndex = 0;
//     // PieceTable.Nodes[0].End.ColumnIndex = 10;
//     // PieceTable.Nodes[0].Length = 11;
//     // PieceTable.Nodes[0].LineFeedCount = 1;

//     // PieceTable.Nodes[1].BufferIndex = 1;
//     // PieceTable.Nodes[1].Start.LineIndex = 0;
//     // PieceTable.Nodes[1].Start.ColumnIndex = 0;
//     // PieceTable.Nodes[1].End.LineIndex = 0;
//     // PieceTable.Nodes[1].End.ColumnIndex = 1;
//     // PieceTable.Nodes[1].Length = 2;
//     // PieceTable.Nodes[1].LineFeedCount = 0;

//     // PieceTable.Nodes[2].BufferIndex = 0;
//     // PieceTable.Nodes[2].Start.LineIndex = 1;
//     // PieceTable.Nodes[2].Start.ColumnIndex = 0;
//     // PieceTable.Nodes[2].End.LineIndex = 1;
//     // PieceTable.Nodes[2].End.ColumnIndex = 0;
//     // PieceTable.Nodes[2].Length = 1;
//     // PieceTable.Nodes[2].LineFeedCount = 0;

//     // PieceTable.Nodes[3].BufferIndex = 0;
//     // PieceTable.Nodes[3].Start.LineIndex = 1;
//     // PieceTable.Nodes[3].Start.ColumnIndex = 1;
//     // PieceTable.Nodes[3].End.LineIndex = 1;
//     // PieceTable.Nodes[3].End.ColumnIndex = 2;
//     // PieceTable.Nodes[3].Length = 2;
//     // PieceTable.Nodes[3].LineFeedCount = 0;

//     // PieceTable.Nodes[4].BufferIndex = 0;
//     // PieceTable.Nodes[4].Start.LineIndex = 1;
//     // PieceTable.Nodes[4].Start.ColumnIndex = 3;
//     // PieceTable.Nodes[4].End.LineIndex = 2;
//     // PieceTable.Nodes[4].End.ColumnIndex = 10;
//     // PieceTable.Nodes[4].Length = 18;
//     // PieceTable.Nodes[4].LineFeedCount = 2;


//     PieceTable.Buffers.Clear();
//     PieceTable.Buffers.Resize(1);
//     PieceTable.Buffers[0].Text = U"0123456789\n0123456789\n9876543210\n";
//     PieceTable.Buffers[0].LineStarts.Add(0);
//     PieceTable.Buffers[0].LineStarts.Add(11);
//     PieceTable.Buffers[0].LineStarts.Add(22);

//     PieceTable.Nodes.Clear();
//     PieceTable.Nodes.Resize(1);
//     PieceTable.Nodes[0].BufferIndex = 0;
//     PieceTable.Nodes[0].Start.LineIndex = 0;
//     PieceTable.Nodes[0].Start.ColumnIndex = 0;
//     PieceTable.Nodes[0].End.LineIndex = 2;
//     PieceTable.Nodes[0].End.ColumnIndex = 10;
//     PieceTable.Nodes[0].Length = 33;
//     PieceTable.Nodes[0].LineFeedCount = 3;


// }
